我正在尝试使用Linq查询从数据库获取记录列表。
public void Main() {
var filter = new Filter();
filter.ReceiverState = new List<DocumentState> { DocumentState.Completed };
var q = from d in Documents
where filter.ReceiverState.Any(f => (d.ReceiverState & (int)f) != 0)
select d;
q.Dump();
}
public class Filter {
public List<DocumentState> ReceiverState { get; set; }
}
[Flags]
public enum DocumentState {
Sent = 1,
NeedClarification = 2,
Completed = 4,
NeedResign = 8
}
但是我得到这个错误:
局部序列不能在LINQ to SQL的查询操作符实现中使用,除了Contains操作符
我必须在过滤器中使用标记枚举的列表。我如何才能使一个正确的Linq查询?
应该可以,
var filter = new Filter();
filter.ReceiverStates = new List<DocumentState> { DocumentState.Completed };
var documents = new List<Document>();
var result = documents.Where(d => filter.ReceiverStates.Contains(d.ReceiverState));
你正在传递一个序列(ReceiverState)来比较它与文档,linq sql不这样工作,你能做的是传递一个单一的值来比较,或者另一种方式得到的文档和比较它们与你的列表(ReceiverState)
我不知道你为什么在这里使用列表,我看到你只寻找标记为完成的文档。
(没有尝试任何这段代码,但我知道这种方法将工作,因为我使用它之前)
var q = from d in Documents
where (DocumentState)d.ReceiverState & DocumentState.Completed == DocumentState.Completed
select d;
但如果你需要使用列表作为过滤器,你可以尝试这个(不是最好的事情做大量的记录),但它会工作,因为在你开始在文档中循环,它不再linq到sql,基本上你是比较一个单一的值一次
var docs = from d in Documents select d;
foreach(var f in filter.ReceiverState)
{
docs = docs.Where(x => (DocumentState)x.ReceiverState & f == f)
}