首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MultiValueDictionary代替字典与NHibernate.Criterion.Restrictions

用MultiValueDictionary代替字典与NHibernate.Criterion.Restrictions
EN

Stack Overflow用户
提问于 2017-05-11 20:09:10
回答 1查看 776关注 0票数 1

目前,我有这样的代码,它可以得到一个foodList:

代码语言:javascript
复制
var myDictionary = new System.Collections.Generic.Dictionary<string, object>();
myDictionary .Add("RefId",1);
myDictionary.Add("Type", "fruit");
var foodList = this.factoryService.GetMyService()
                    .GetByCriteria(sortOrder, NHibernate.Criterion.Restrictions.AllEq(myDictionary));

我想使用MultiValueDictionary来收集多个类型。

代码语言:javascript
复制
var multiValueDictionary = new System.Collections.Generic.MultiValueDictionary<string, object>();
multiValueDictionary.Add("RefId",1);
multiValueDictionary.Add("Type", "fruit");
multiValueDictionary.Add("Type", "vegetable");
multiValueDictionary.Add("Type", "fungus");

var foodList = this.factoryService.GetMyService()
                    .GetByCriteria(sortOrder, NHibernate.Criterion.Restrictions.AllEq(multiValueDictionary));

最后一行没有编译,因为MultiValueDictionary没有实现IDictionary,因此出现了以下错误:

错误'System.Collections.Generic.MultiValueDictionary‘参数1:无法从CS1503转换为“System.Collections.IDictionary”

我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 11:49:15

实现只是:

/对IDictionary /字典中的每个属性应用“等于”约束,从属性名称到值/ public静态AbstractCriterion AllEq(IDictionary propertyNameValues) { conj =conj();foreach (propertyNameValues中的DictionaryEntry项){ conj.Add(Eq(item.Key.ToString(),item.Value));}返回conj;}

因此,对于多值情况,可以停止将其放在字典中,然后手动添加:

代码语言:javascript
复制
var myDictionary = new Dictionary<string, object>();
myDictionary.Add("RefId", 1);

var filter = (Conjunction)Restrictions.AllEq(myDictionary);
filter.Add(Restrictions.In("Type", new [] {"fruit", "vegetable", "fungus"});

var foodList = this.factoryService.GetMyService()
    .GetByCriteria(sortOrder, filter);

当然,如果现在只有RefId可以放在字典中,那么最好简化它:

代码语言:javascript
复制
var filter = Restrictions.Conjunction();
filter.Add(Restrictions.Eq("RefId", 1));
filter.Add(Restrictions.In("Type", new [] {"fruit", "vegetable", "fungus"}));

var foodList = this.factoryService.GetMyService()
    .GetByCriteria(sortOrder, filter);

现在,如果您想要一个处理多值的AllIn,那么对它进行编码:

代码语言:javascript
复制
public static AbstractCriterion AllIn<TValue>(
    MultiValueDictionary<string, TValue> propertyNameValues)
{
    var conj = Restrictions.Conjunction();

    foreach (KeyValuePair<TKey, IReadOnlyCollection<TValue>> item in propertyNameValues)
    {
        if (item.Value.Count > 1)
        {
            conj.Add(Restrictions.In(item.Key, item.Value.ToArray()));
        }
        else
        {
            conj.Add(Restrictions.Eq(item.Key, item.Value.FirstOrDefault()));
        }
    }

    return conj;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43924662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档