xzk
xzk

Reputation: 877

LINQ to Entities does not recognize the method IsUserInCc

My Code:

elections = elections.Where(e => e.Creator == Username || e.Approver == Username || IsUserInCc(e.Cc,Username))
    .OrderBy(e => e.Status)
    .ThenByDescending(e => e.Group);
var test = elections.FirstOrDefault();

private bool IsUserInCc(string cc, string username)
{
    var ccList = cc.Split(';');
    if (ccList.Contains(username))
        return true;
    return LDAPUtility.Instance.IsUserInGroup(ccList.ToList(), username);
}

Error:

LINQ to Entities does not recognize method IsUserInCc.

From many posts, I can understand why error was thrown. Basically IsUserInCc is not available in SQL execution. I need somehow convert it back to C# to handle it.

LINQ to Entities does not recognize my method

LINQ to Entities does not recognize the method in query

LINQ to Entities does not recognize the method 'System.String ToString(Int32)'

However, in my specific case, what is the best approach?

Upvotes: 3

Views: 176

Answers (5)

Captain Kenpachi
Captain Kenpachi

Reputation: 7215

The root cause of your issue is that your underlying data isn't normalised properly. You need to put your CC's in a collection, not have them as a single deliniated string.

In SQL you'd need to add a new table called CC or something and put each user name in there and link it back to an election. Or if it's an in-memory collection, add a new property that in its Getter will do the split for you.

Either way, then you won't run into this kind of problem. If your data isn't properly structured, you will create problems for yourself further up the stack.

Upvotes: 1

Sarav
Sarav

Reputation: 149

For your function written in code, you cannot use that on Queryables. You need to convert to in-memory list and then apply the filter required using your function.

Upvotes: 1

Coskun Ozogul
Coskun Ozogul

Reputation: 2469

Can you try like this :

 elections = elections.Where(e => e.Creator == Username || e.Approver == Username).Tolist().Where(e => IsUserInCc(e.Cc,Username))
.OrderBy(e => e.Status)
.ThenByDescending(e => e.Group);

var test = elections.FirstOrDefault();

private bool IsUserInCc(string cc, string username)
{
    var ccList = cc.Split(';');
    if (ccList.Contains(username))
        return true;
    return LDAPUtility.Instance.IsUserInGroup(ccList.ToList(), username);
}

Upvotes: 0

AmirReza-Farahlagha
AmirReza-Farahlagha

Reputation: 1212

When you want to send request to databaseusing Linq like:

var query = listData.Where(x=>x.Id == 123);

Type of this query is IQueryable that means your query not Executed yet!

Now you are sending data as IQueryable to method and can not process on your data, you have to Execute that with methods like: Tolist(), ToListAsync() or something like these.

The best way for these is that you get data from database without that method, after that you execute your query, you can Run this method.

GoodLuck.

Upvotes: 0

Lyco
Lyco

Reputation: 569

You need to convert to list first. Also note that elections must be able to hold a list for this to run.

elections = elections.ToList().Where(e => e.Creator == Username || e.Approver == Username || IsUserInCc(e.Cc,Username))
.OrderBy(e => e.Status)
.ThenByDescending(e => e.Group);

Upvotes: 2

Related Questions