2 Feature Suggest

Jan 14, 2010 at 11:12 AM

1,现在GetObject不支持Linq的Where写法,所以我基本都用From Range代替了,其实这个很有用。

 

2,ManyToMany的时候,一般在添加之前都要检查是否Contain,如果直接检查Contain,DbEntry会直接getlist再Contain,效率不高。我现在都直接查关联表看是否有那个值,代替Contain,不知老大未来是否考虑实现Contain~

 

新版蛮好用~

Jan 14, 2010 at 11:13 AM

还有,一直不理解为啥Range之前一定要OrderBy

Coordinator
Jan 14, 2010 at 12:40 PM
  1. GetObject支持Linq的Where写法啊。
  2. ManyToMany不打算再加强了,对于中间表需要额外数据的情况,还是需要用2个多对一来实现,在开发过程中才发现需要从多对多改成2个多对一是挺烦人的。
  3. 没有OrderBy的话,则无法确定顺序,Range取得的值也就具有不确定性,所以类似SqlServer 2005中的分页语句,本身就要求有OrderBy的。
Jan 14, 2010 at 12:56 PM

不知老大是每看明白我问的第二题还是。。。

两个多对1怎么个代替ManyToMany。。。

我的意思是现在我要往CrossTable里添加数据的时候,应该先检查CrossTable有没有这个数据(CrossTable就是老大默认的那种双主键表, 一般要用Where查一遍是否有这个双主键)

说白了就有点像SmartUpdate里面的那种检查IndexUnique一样的Validation逻辑

就是现在这种Validation俺都是用DbEntry.GetObject...==null做的,其实应该直接A.B.Contains()==true

 

Jan 14, 2010 at 12:58 PM

不过也无所谓啦貌似,用的也不多。。

 

Coordinator
Jan 14, 2010 at 1:07 PM

我知道你第二个问题的意思,我的意思是,其实我现在觉得,ManyToMany最好用2个ManyToOne代替,也就是说,不推荐使用ManyToMany,所以也不准备在ManyToMany做更多的修改了。

当然,你的这个提议对ManyToMany确实有些实际意义。

Jan 14, 2010 at 2:39 PM

用2个ManyToOne代替固然可以,但是我在查询的时候岂不是还要写JoinOn的实体,太麻烦了。。。。

本来一个ManyToMany能解决的问题,最后还要写一个Join类去查询。。。

Coordinator
Jan 14, 2010 at 3:47 PM

使用ManyToMany:

 

public abstract class Reader
{
	public abstract string Name;
	[HasAndBelongsToMany]
	public IList<Article> Articles;
}

public abstract class Article
{
	public abstract string Title;
	[HasAndBelongsToMany]
	public IList<Reader> Readers;
}

 

使用2个ManyToOne:

 

public abstract class Reader
{
	public abstract string Name;
	[HasMany]
	public IList<CrossReaderArticle> Cross;
}

public abstract class CrossReaderArticle
{
	[BelongsTo]
	public Reader Reader;
	[BelongsTo]
	public Article Article;

	public int Score;
}

public abstract class Article
{
	public abstract string Title;
	[HasMany]
	public IList<CrossReaderArticle> Cross;
}

 

第二种方式在CrossTable里增加了用户评分。使用上也没有复杂多少,不需要JoinOn实体的:

var reader = Reader.FindById(1);
Console.WriteLine(reader.Name);
Console.WriteLine(reader.Cross[0].Score);
Console.WriteLine(reader.Cross[0].Article.Title);

 

Coordinator
Jan 14, 2010 at 3:49 PM
Edited Jan 14, 2010 at 3:52 PM

目前使用2个ManyToOne的问题主要在保存时,不是很智能。保存的问题已经建立了work item,不过解决起来有点儿麻烦。