我试图使用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
}
但是我收到了这个错误:
除了Contains运算符
之外,本地序列不能用于查询运算符的LINQ to SQL实现
我必须在过滤器中使用flaged枚举列表。我如何才能做出正确的Linq查询?
答案 0 :(得分:0)
这应该有效,
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));
答案 1 :(得分:0)
你传递一个序列(ReceiverState)来将它与文档进行比较,linq到sql不会这样工作,你能做的就是将一个值传递给comapre,或者反过来获取文档并将其与列表(ReceiverState)进行比较
我不确定您为什么要在此处使用列表,我发现您只查找标记为已完成的文档。
(Haven没有尝试任何此代码,但我知道这种方法可以像我之前使用的那样工作)
var q = from d in Documents
where (DocumentState)d.ReceiverState & DocumentState.Completed == DocumentState.Completed
select d;
但是如果你需要使用一个列表作为过滤器,你可以尝试这个(不是最好的事情与大量的记录),但它会工作,因为你现在开始循环文档,它&#39; s不再是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)
}