zzzprojects / EntityFramework-Classic

Entity Framework Classic is a supported version of the latest EF6 codebase. It supports .NET Framework and .NET Core and overcomes some EF limitations by adding tons of must-haves built-in features.
https://entityframework-classic.net
Other
103 stars 27 forks source link

Creating new array inside expression string - Execute extension method #60

Closed Mat3oo closed 3 years ago

Mat3oo commented 3 years ago

With this expressions string passed into Execute extension method:

Where(p => new []{ 1, 2, 3, 4 }.Contains(p.Id))

library loses the new keyword and replace it with (IEnumerable<int>) cast, so causing exception.

Example repo (newArray branch) replicating the problem.

Exception details:

JonathanMagnan commented 3 years ago

Hello @Mat3oo ,

Is there a reason why you don't create the list outside of the LINQ query and check in the LINQ if the list contains it?

Such as:

var list = new List<int> { 1, 2, 3, 4};

DbSet<Element>
    .Where(e => e.Name == "test")
    .Where(e => e.Active)
    .Where(e => list.Contains(e.Id));

Best Regards,

Jon

Mat3oo commented 3 years ago

I'm using urs Execute method:

var list = new List<int> { 1, 2, 3, 4};

DbSet<Element>
    .Execute<object>(
    "Where(e => e.Name == \"test\")" +
    "Where(e => e.Active)" +
    "Where(e => list.Contains(e.Id))");

and in this case it's not possible for string to know about list. In the repo from first comment is nice example.

*Missclick Close issue

JonathanMagnan commented 3 years ago

You can pass it in parameter such as:

var list = new List<int> { 1, 2, 3, 4};

DbSet<Element>
    .Execute<object>(
    "Where(e => e.Name == \"test\")" +
    "Where(e => e.Active)" +
    "Where(e => list.Contains(e.Id))", new { list });
Mat3oo commented 3 years ago

You can pass it in parameter

I know, but not the case for me. I passing string between services, so I would like to use new [] {} inplace.

JonathanMagnan commented 3 years ago

Hello @Mat3oo ,

Just to let you know that we continue to work on both issues.

We made some progression last week and find out why this happening (due to a convert on our side for using the Contains method).

Everything work without EF since this CAST doesn't cause any problem. However, in EF, this additional CAST cannot be translated in SQL which throw the error.

JonathanMagnan commented 3 years ago

Hello @Mat3oo ,

A new version has been released today.

We fixed this issue and the C# Eval Library will no longer try to CAST the array into IEnumerable which was causing the error in Entity Framework.

Let me know if everything works as expected.

Best Regards,

Jon

Mat3oo commented 3 years ago

It's seems with Z.Expressions.Eval v4.0.18 the problem new [] is resolved, and also #59 working now as expected, gj 👍🏼.

JonathanMagnan commented 3 years ago

Great Mat3oo!

Don't hesitate to contact me for further assistance.

Best regards,

Jon