在LINQ扩展方法中不能使用==

时间:2013-12-09 18:05:19

标签: linq

我有以下结构,这是我字典的关键:

public struct CodeAttribute
{
   public int ProcessorId;
   public Enums.TransactionType transactionType;
   public string ErrorMessage; 
}

我有以下字典(现在只有一个例子):

var errors = new Dictionary<CodeAttribute, int>
{
   {CreateCodeAttributeList(2, Enums.TransactionType.Order, "Invalid ProcessorId sent in the Payment Request"), 100 }
};

我正在尝试将字典中的项目拉出与其ProcessorId和TransactionType属性匹配的结构上匹配:

private static string GetRelatedMessage(int errorCode, Dictionary<CodeAttribute, int> errorsList)
{
   CodeAttribute codeAttribute = errorsList.Where(e => e.Key.ProcessorId == _processorId)
                                           .Where(e => e.Key.transactionType == _transactionType) == errorCode;
   return codeAttribute.ErrorMessage;
}

我还希望将错误代码作为过滤的一部分进行匹配,而不仅仅是payprocessorId和transactionType,只是旁注。字典中的项必须匹配所有3个值,以便在我们的案例中得到正确的值。

更新

我也尝试了这个,是的,我得到的错误是它无法将IEnumerable转换为CodeAtribute

CodeAttribute codeAttributes = errorsList.Where(e => e.Key.ProcessorId == _processorId)
                                         .Where(e => e.Key.transactionType == _transactionType)
                                         .Where(e => e.Value.Equals(errorCode));

更新

在Sam的帮助下,我认为这可能有用

CodeAttribute codeAttribute = errorsList.FirstOrDefault(e => e.Key.ProcessorId ==
_processorId && e.Key.transactionType == _transactionType
             && e.Value == errorCode).Key;

3 个答案:

答案 0 :(得分:2)

如果我理解正确,那么你想要

var codeAttribute = errorsList.FirstOrDefault(e => 
                                                e.Key.ProcessorId == _processorId
                                             && e.Key.transactionType == _transactionType
                                             && e.Value == errorCode);

    if(codeAttribute == null)
    {
      //no item matches in the dictionary.
    }

return codeAttribute.Key.ErrorMessage;

请注意codeAttributeKeyValuePair,因此您需要codeAttribute.Key.ErrorMessage作为返回值。

您不需要使用Where,因为它会返回IEnumerable,因此如果您想要一个项目,这将无效。


答案 1 :(得分:1)

您可能需要使用以下内容:

CodeAttribute codeAttribute = errorsList.FirstOrDefault(e => e.Key.ProcessorId == _processorId && e.Key.transactionType ==_transactionType)

答案 2 :(得分:0)

虽然其他答案都是正确的,但可能会这样写:

var errorMessage = errorsList
       .Where(e => e.Key.ProcessorId == _processorId
                   && e.Key.transactionType == _transactionType
                   && e.Value == errorCode)
       .Select(e => e.Key.ErrorMessage)
       .FirstOrDefault();

也就是说,将条件推送到先前过滤,从该结果集中选择我想要的数据,然后获取转换数据的第一个结果(如果存在)。

由于IEnumerable查询 lazy ,所以这仍然会在第一个成功过滤的对象上停止。


由于源是 Dictionary ,因此设置相关的Equals / GetHashCode并构造代码以便将其使用也是谨慎的。