結果としてバイナリおよび/またはバイナリまたは演算である式を作成したいと思います。何かのようなもの
int a = 1;
int b = 2;
int c = 3;
int d = a & b; // d = 0
int e = a & c; // e = 1
動的linqで何も見つかりませんでした!しかし、linqではこれは正常な表現です!
public class Customer{
[Flags]
public enum Status{
None = 0,
Blocked = 1,
Present = 2,
Paid = 4
}
// Holds the numeric status from database.
public int CustomerStatusValue{get; set;}
}
var listOfCustomers = new List<Customer>(); // Would load from db...
// This works in linq
var result = listOfCustomers.Where(c => (c.CustomerStatusValue & 3) != 0);
// This does not work!!!
var result = listOfCustomers.AsQueryable()..Where("(CustomerStatusValue & 3) != 0");
Frédéricの提案に基づいて、System.Dynamic.Linqファイルをダウンロードし、「&」と「|」に変更しましたオペレーター:
// +, -, &, | operators Expression ParseAdditive() { Expression left = ParseMultiplicative(); while (token.id == TokenId.Plus || token.id == TokenId.Minus || token.id == TokenId.Amphersand || token.id == TokenId.Bar) { Token op = token; NextToken(); Expression right = ParseMultiplicative(); switch (op.id) { case TokenId.Plus: if (left.Type == typeof(string) || right.Type == typeof(string)) goto case TokenId.Amphersand; CheckAndPromoteOperands(typeof(IAddSignatures), op.text, ref left, ref right, op.pos); left = GenerateAdd(left, right); break; case TokenId.Minus: CheckAndPromoteOperands(typeof(ISubtractSignatures), op.text, ref left, ref right, op.pos); left = GenerateSubtract(left, right); break; case TokenId.Amphersand: if (IsNumericType(left.Type) && IsNumericType(right.Type)) { left = GenerateBinaryAnd(left, right); } else{ left = GenerateStringConcat(left, right); } break; case TokenId.Bar: if (IsNumericType(left.Type) && IsNumericType(right.Type)) { left = GenerateBinaryOr(left, right); } else { left = GenerateStringConcat(left, right); } break; } } return left; } Expression GenerateBinaryAnd(Expression left, Expression right) { return Expression.MakeBinary(ExpressionType.And, left, right); } Expression GenerateBinaryOr(Expression left, Expression right) { return Expression.MakeBinary(ExpressionType.Or, left, right); }
ParseAdditive関数を置き換え、2項演算を行う2つの新しい関数を作成しました。したがって、.Where( "(a&B)> 0")のようなものは今やうまくいきます!!!!
エラーチェックが欠落しており、「ParseAdditive」関数の名前が適切な場所または名前ではない可能性があるため、これは最終バージョンではありませんが、機能します。